import * as types from './mutation-types'
import { playMode } from 'common/js/config'
import { shuffle } from 'common/js/util'
import {saveSearch,deleteSearch,clearAllSearch,savePlay,saveFavorite,deleteFavorite} from 'common/js/cache'

function findIndex(list, song) {
    return list.findIndex((item) => {
        return item.id === song.id
    })
}

export const selectPlay = function ({ commit, state }, { list, index }) {
    commit(types.SET_SEQUENCE_LIST, list)
    if (state.mode === playMode.random) {
        let randomList = shuffle(list)
        commit(types.SET_PLAYLIST, randomList)
        index = findIndex(randomList, list[index])
    } else {
        commit(types.SET_PLAYLIST, list)
    }

    commit(types.SET_CURRENT_INDEX, index)
    commit(types.SET_FULL_SCREEN, true)
    commit(types.SET_PLAYING_STATE, true)
}

export const randomPlay = function ({ commit }, { list }) {
    commit(types.SET_PLAY_MODE, playMode.random)
    commit(types.SET_SEQUENCE_LIST, list)
    let randomList = shuffle(list)
    commit(types.SET_PLAYLIST, randomList)
    commit(types.SET_CURRENT_INDEX, 0)
    commit(types.SET_FULL_SCREEN, true)
    commit(types.SET_PLAYING_STATE, true)
}

// 搜索页面的播放歌曲
export const insertSong = function ({ commit, state }, song) {
    //这里action不能直接对state的状态进行修改，必须通过mutation，而且数组是引用的
    //所以下面数组必须是截取使用
    let playlist = state.playlist.slice();
    let sequenceList = state.sequenceList.slice();
    let currentIndex = state.currentIndex

    //记录当前歌曲
    let currentSong = playlist[currentIndex]
    //查找当前列表中是否有待插入的歌曲并返回索引
    let fpIndex = findIndex(playlist, song)
    //因为要插入歌曲，所以索引+1
    currentIndex++;
    //插入这首歌曲当前的索引位置
    playlist.splice(currentIndex, 0, song)

    //这里面有这一首歌曲
    if (fpIndex > -1) {
        //插入位置在这首歌之后
        if (currentIndex > fpIndex) {
            playlist.splice(fpIndex, 1)
            currentIndex--;
        } else {
            playlist.splice(fpIndex + 1, 1)
        }
    }

    let currentSIndex = findIndex(sequenceList, currentSong) + 1

    let fsIndex = findIndex(sequenceList, song)

    sequenceList.splice(currentSIndex, 0, song)

    if (fsIndex > -1) {
        if (currentSIndex > fsIndex) {
            sequenceList.splice(fsIndex, 1)
        } else {
            sequenceList.splice(fsIndex + 1, 1)
        }
    }

    commit(types.SET_PLAYLIST, playlist)
    commit(types.SET_SEQUENCE_LIST, sequenceList)
    commit(types.SET_CURRENT_INDEX, currentIndex)
    commit(types.SET_FULL_SCREEN, true)
    commit(types.SET_PLAYING_STATE, true)

}


export const saveSearchHistory = function({commit},query) {
    commit(types.SET_SEARCH_HISTORY,saveSearch(query))
}

export const deleteSearchHistory = function({commit},query) {
    commit(types.SET_SEARCH_HISTORY,deleteSearch(query))
}

export const clearSearchHistory = function({commit}) {
    commit(types.SET_SEARCH_HISTORY,clearAllSearch())
}

export const deleteSong = function ({commit,state},song) {
    let playlist = state.playlist.slice();
    let sequenceList = state.sequenceList.slice();
    let currentIndex = state.currentIndex
    console.log(typeof(currentIndex))
    let pIndex = findIndex(playlist,song)
    playlist.splice(pIndex,1);
    let sIndex = findIndex(sequenceList,song)
    sequenceList.splice(sIndex,1);

    if(currentIndex > pIndex || currentIndex === playlist.length) {
        currentIndex--
    }
    commit(types.SET_PLAYLIST,playlist);
    commit(types.SET_SEQUENCE_LIST,sequenceList);
    commit(types.SET_CURRENT_INDEX,currentIndex)
    
    if(!playlist.length) {
        commit(types.SET_PLAYING_STATE,false)
    }else {
        commit(types.SET_PLAYING_STATE,true)
    }
}

export const deleteSongList = function ({commit}) {
    commit(types.SET_PLAYLIST,[])
    commit(types.SET_SEQUENCE_LIST,[])
    commit(types.SET_CURRENT_INDEX,-1)
    commit(types.SET_PLAYING_STATE,false)
}

export const savePlayHistory = function({commit},song) {
    commit(types.SET_PLAY_HISTORY,savePlay(song))
}


export const saveFavoriteList = function({commit},song) {
    commit(types.SET_FAVORITE_LIST,saveFavorite(song))
}

export const deleteFavoriteList =function({commit},song) {
    commit(types.SET_FAVORITE_LIST,deleteFavorite(song))
}